package com.ruoyi.course.domain.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 课程表视图对象，用于前端展示结构化的课程信息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TimetableVO implements Serializable {
    private static final long serialVersionUID = 1L;

    /** 学年 */
    private String academicYear;

    /** 学期ID */
    private Long semesterId;

    /** 周次列表（1-7代表周一到周日） */
    private List<Weekday> weekdays = new ArrayList<>();

    // 星期数据
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Weekday implements Serializable {
        private static final long serialVersionUID = 1L;

        /** 星期几（1-7） */
        private Long dayOfWeek;

        /** 时间段列表（如上午、下午、晚上） */
        private List<TimeSlot> timeSlots = new ArrayList<>();
    }

    // 时间段数据
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TimeSlot implements Serializable {
        private static final long serialVersionUID = 1L;

        /** 时间段名称（如"上午"、"下午"、"晚上"） */
        private String timePeriod;

        /** 课程/占用信息列表 */
        private List<CourseOccupancy> courses = new ArrayList<>();
    }

    // 课程/占用信息
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class CourseOccupancy implements Serializable {
        private static final long serialVersionUID = 1L;

        /** 开始节次 */
        private Integer startLesson;

        /** 结束节次 */
        private Integer endLesson;

        /** 课程名称/占用原因 */
        private String title;

        /** 地点 */
        private String location;

        /** 其他信息（如是否可用、创建者等） */
        private Map<String, Object> extraInfo = new HashMap<>();

        // 便捷构造方法
        public CourseOccupancy(Integer startLesson, Integer endLesson, String title, String location) {
            this.startLesson = startLesson;
            this.endLesson = endLesson;
            this.title = title;
            this.location = location;
        }
    }
}